#ifndef NPDM_OPERATORS_H
#define NPDM_OPERATORS_H

#include "npdm_patterns.h"

using namespace Npdm;

//===========================================================================================================================================================

class Npdm_operators
{

  public:
    Npdm_operators() {};
    Npdm_operators(int nsites) { nsites_ = nsites; };

    void build_operator_set(char block, int dotsite, std::vector<CD> & cdvec);

    std::map< std::vector<CD>, std::set< std::vector< std::pair<CD,int> > > >  lhs_ops;
    std::map< std::vector<CD>, std::set< std::vector< std::pair<CD,int> > > >  dot_ops;
    std::map< std::vector<CD>, std::set< std::vector< std::pair<CD,int> > > >  rhs_ops;

  private:
    int nsites_;

    std::set< std::vector< std::pair<CD,int> > > build_1index_ops(char block, int site1, int site2, std::vector<CD> & cdvec);
    std::set< std::vector< std::pair<CD,int> > > build_2index_ops(char block, int site1, int site2, std::vector<CD> & cdvec);
    std::set< std::vector< std::pair<CD,int> > > build_3index_ops(char block, int site1, int site2, std::vector<CD> & cdvec);
    std::set< std::vector< std::pair<CD,int> > > build_4index_ops(char block, int site1, int site2, std::vector<CD> & cdvec);
    std::set< std::vector< std::pair<CD,int> > > build_5index_ops(char block, int site1, int site2, std::vector<CD> & cdvec);
    std::set< std::vector< std::pair<CD,int> > > build_6index_ops(char block, int site1, int site2, std::vector<CD> & cdvec);
    bool is_valid_opstring( std::vector< std::pair<CD,int> > & opstring );
    void print_opstring( std::vector< std::pair<CD,int> > opstring );

};

//===========================================================================================================================================================

#endif
